// #include <iostream>
// #include <functional>
// using namespace std;

// class A
// {
// public:
//     // 构造函数参数是一个包装器对象
//     A(const function<void()> &f) : callback(f)
//     {
//     }

//     void notify()
//     {
//         callback; // 调用通过构造函数得到的函数指针
//     }

// private:
//     function<void()> callback;
// };

// class B
// {
// public:
//     void operator()()
//     {
//         cout << "我是要成为海贼王的男人!!!" << endl;
//     }
// };
// int main(void)
// {
//     B b;
//     A a(b); // 仿函数通过包装器对象进行包装
//     a.notify();

//     return 0;
// }

// #include <iostream>
// #include <functional>
// using namespace std;

// void callFunc(int x, const function<void(int)> &f)
// {
//     if (x % 2 == 0)
//     {
//         f(x);
//     }
// }

// void output(int x)
// {
//     cout << x << " ";
// }

// void output_add(int x)
// {
//     cout << x + 10 << " ";
// }

// int main(void)
// {
//     // 使用绑定器绑定可调用对象和参数
//     auto f1 = bind(output, placeholders::_1);
//     for (int i = 0; i < 10; ++i)
//     {
//         callFunc(i, f1);
//     }
//     cout << endl;

//     auto f2 = bind(output_add, placeholders::_1);
//     for (int i = 0; i < 10; ++i)
//     {
//         callFunc(i, f2);
//     }
//     cout << endl;

//     return 0;
// }

#include <iostream>
#include <functional>
using namespace std;

class Test
{
public:
    void output(int x, int y)
    {
        cout << "x: " << x << ", y: " << y << endl;
    }
    int m_number = 100;
};

int main(void)
{
    Test t;
    // 绑定类成员函数
    function<void(int, int)> f1 =
        bind(&Test::output, &t, placeholders::_1, placeholders::_2);
    // 绑定类成员变量(公共)
    function<int &(void)> f2 = bind(&Test::m_number, &t);

    // 调用
    f1(520, 1314);
    f2() = 2333;
    cout << "t.m_number: " << t.m_number << endl;

    return 0;
}
